Multi i-TED characterization¶

Fourth: Per pixel threshold¶

  • In the previous notebook it was proposed to apply thresholds per pixel:
    • To get to a lower overall threshold that should equate to better resolution.
    • To decrease the size of files, which increases greatly for lower threshoilds due to noise.
    • To study if it impacts the considerable increase in resolution present in iTED-C-0 that was hypothesised being related to noise starting the integration window.
  • The 888 configuration is compared to 887 and 88c which stands for 887 with some pixels changed manually.
  • Studies of alpha activity and noise are added.
In [1]:
pkg_ver = lambda pkg: "{:<20}{:}".format(pkg.__name__,pkg.__version__)

# ROOT
import uproot
print(pkg_ver(uproot))
import ROOT

# Machine Learning
import sklearn
print(pkg_ver(sklearn))
import torch
print(pkg_ver(torch))

# Data science
import scipy
print(pkg_ver(scipy))
import numpy
print(pkg_ver(numpy))
import pandas
print(pkg_ver(pandas))

# Visualizations
import matplotlib
print(pkg_ver(matplotlib))
import matplotlib.pyplot as plt

import tqdm
print(pkg_ver(tqdm))
uproot              4.3.5
Welcome to JupyROOT 6.26/10
sklearn             1.2.2
torch               2.0.0rc5
scipy               1.10.1
numpy               1.24.2
pandas              1.5.3
matplotlib          3.6.3
tqdm                4.62.3
In [2]:
%jsroot
In [3]:
class spectrum:
    
    def __init__(self, TH1D_, iTED_, Crystal_, Configuration_, Window_, Calibration_):  

        self.__TH1D = TH1D_
        self.__iTED = iTED_
        self.__Crystal = Crystal_
        self.__Configuration = Configuration_
        self.__Window = Window_
        self.__Calibration = Calibration_
        
    def __call__(self, ch):
        return numpy.polyval(self.__Calibration[::-1],ch)
    
    def __ch__(self, en):
        p = numpy.poly1d(self.__Calibration[::-1])
        temp  = set(i for i in (p - en).roots if i > 0)
        return list(temp).pop()
    
    def TH1D(self):
        return self.__TH1D
    
    def Calibration(self):
        return self.__Calibration
    
    def iTED(self):
        return self.__iTED
    
    def Crystal(self):
        return self.__Crystal
    
    def Configuration(self):
        return self.__Configuration
    
    def Window(self):
        return self.__Window
    
    def Noise(self, Time_):
        return self.__TH1D.Integral(
            0,
            self.__TH1D.FindBin(self.__ch__(200))
        )/Time_
    
    def Alpha(self, Time_):
        return self.__TH1D.Integral(
            self.__TH1D.FindBin(self.__ch__(1600)),
            self.__TH1D.FindBin(self.__ch__(2800))
        )/Time_
    
    def __repr__(self):
        return "iTED: {},Crystal: {},Configuration: {},Window: {}".format(
            self.__iTED,
            self.__Crystal,
            self.__Configuration,
            self.__Window
        )
    
    def __str__(self):
        return "{}.{}.{}.{}".format(
            self.__iTED,
            self.__Crystal,
            self.__Configuration,
            self.__Window
        )
In [4]:
iTEDA_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDA.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTEDB_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDB.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTEDC_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDC.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTEDD_cal = pandas.read_csv(
    "../../data/2023-03-02/Energy_Calibrations_02_03_2023/Energy_Calibrations_iTEDD.dat",
    delim_whitespace=True,
    names=["P0","P1","P2"]
)

iTED_cal = pandas.concat([iTEDA_cal.T, iTEDB_cal.T, iTEDC_cal.T, iTEDD_cal.T], axis=1, keys=['A', 'B', 'C', 'D'])

iTED_cal
Out[4]:
A B C D
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
P0 97.91440 138.744000 164.131000 96.575700 184.627000 123.545000 181.753000 164.939000 162.539000 156.664000 115.328000 147.053000 129.204000 144.779000 132.346000 91.325100 138.429000 121.824000 138.067000 122.738000
P1 1.96942 1.813160 2.304510 1.764130 2.327000 2.228220 2.581200 2.116580 2.010630 2.193700 2.179250 2.005310 2.079170 2.152760 2.311890 2.016440 2.065850 2.071090 2.132460 1.964320
P2 0.00042 0.000665 0.001125 0.000595 0.001193 0.000559 0.001048 0.001154 0.000915 0.000946 0.000469 0.000859 0.000717 0.000836 0.000898 0.000479 0.000809 0.000667 0.000949 0.000705
In [5]:
config = ["888", "887", "88c"]
CW = [100,150,200,250]

ited = ["A","B","C","D"]
crystal = [0,1,2,3,4]

midx = pandas.MultiIndex.from_product(
    [config, CW],
    names=['Configuration', 'Window']
)

mcol = pandas.MultiIndex.from_product(
    [ited, crystal],
    names=['iTED', 'Crystal']
) 

spectra = pandas.DataFrame(index = midx, columns = mcol)

# Access using spectra[iTED,Crystal][Configuration,Window]
In [6]:
iTEDA = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_02_23_T.13_40_46_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDA-A2_D.2023_03_14_T.14_28_07_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDA-A2_D.2023_03_21_T.14_50_48_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}

iTEDB = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137_AfterReconnecting_gum_iTEDB-middle_D.2023_03_02_T.15_22_31_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDB-A2_D.2023_03_14_T.14_35_17_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDB-A2_D.2023_03_21_T.14_57_39_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}

iTEDC = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_02_23_T.13_26_03_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDC-A1_D.2023_03_14_T.14_41_53_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDC-A1_D.2023_03_21_T.15_05_52_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}

iTEDD = {
    "888-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW100.root","READ"),
    "888-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW150.root","READ"),
    "888-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW200.root","READ"),
    "888-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_02_23_T.13_03_18_C.itedABCD_lab_2023.02.22_4.0v_888_300s_CW250.root","READ"),
    "88c-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "88c-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "88c-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "88c-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/CS137-iTEDD-A1_D.2023_03_14_T.14_48_58_C.itedABCD_lab_custom_2023.02.22_4.0v_887_300s_CW250.root","READ"),
    "887-100": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW100.root","READ"),
    "887-150": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW150.root","READ"),
    "887-200": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW200.root","READ"),
    "887-250": ROOT.TFile.Open("../../data/Multi_iTED_characterization/Cs137-iTEDD-A1_D.2023_03_21_T.15_12_02_C.itedABCD_lab_2023.02.22_4.0v_887_300s_CW250.root","READ")
}
In [7]:
for iTED in[0,1,2,3]:
    for Crystal in [0,1,2,3,4]:
        for Configuration in ["888", "887", "88c"]:
            for CW in [100,150,200,250]:
            
                spectra[
                    ["A","B","C","D"][iTED], Crystal
                ][
                    Configuration, CW
                ] = spectrum(
                    [iTEDA,iTEDB,iTEDC,iTEDD][iTED][f"{Configuration}-{CW}"].Get(
                        "{}_{}_amplitude_spectra;1".format(
                            "SCATTERER" if Crystal==0 else "ABSORBER",
                            ["A","B","C","D"][iTED] if Crystal==0 else "{}_{}".format(["A","B","C","D"][iTED],Crystal)
                        )
                    ), 
                    ["A","B","C","D"][iTED], 
                    Crystal, 
                    Configuration, 
                    CW, 
                    iTED_cal[:][["A","B","C","D"][iTED],Crystal]
                )
In [8]:
spectra.dropna(inplace=True)
spectra.applymap(str)
Out[8]:
iTED A B C D
Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window
888 100 A.0.888.100 A.1.888.100 A.2.888.100 A.3.888.100 A.4.888.100 B.0.888.100 B.1.888.100 B.2.888.100 B.3.888.100 B.4.888.100 C.0.888.100 C.1.888.100 C.2.888.100 C.3.888.100 C.4.888.100 D.0.888.100 D.1.888.100 D.2.888.100 D.3.888.100 D.4.888.100
150 A.0.888.150 A.1.888.150 A.2.888.150 A.3.888.150 A.4.888.150 B.0.888.150 B.1.888.150 B.2.888.150 B.3.888.150 B.4.888.150 C.0.888.150 C.1.888.150 C.2.888.150 C.3.888.150 C.4.888.150 D.0.888.150 D.1.888.150 D.2.888.150 D.3.888.150 D.4.888.150
200 A.0.888.200 A.1.888.200 A.2.888.200 A.3.888.200 A.4.888.200 B.0.888.200 B.1.888.200 B.2.888.200 B.3.888.200 B.4.888.200 C.0.888.200 C.1.888.200 C.2.888.200 C.3.888.200 C.4.888.200 D.0.888.200 D.1.888.200 D.2.888.200 D.3.888.200 D.4.888.200
250 A.0.888.250 A.1.888.250 A.2.888.250 A.3.888.250 A.4.888.250 B.0.888.250 B.1.888.250 B.2.888.250 B.3.888.250 B.4.888.250 C.0.888.250 C.1.888.250 C.2.888.250 C.3.888.250 C.4.888.250 D.0.888.250 D.1.888.250 D.2.888.250 D.3.888.250 D.4.888.250
887 100 A.0.887.100 A.1.887.100 A.2.887.100 A.3.887.100 A.4.887.100 B.0.887.100 B.1.887.100 B.2.887.100 B.3.887.100 B.4.887.100 C.0.887.100 C.1.887.100 C.2.887.100 C.3.887.100 C.4.887.100 D.0.887.100 D.1.887.100 D.2.887.100 D.3.887.100 D.4.887.100
150 A.0.887.150 A.1.887.150 A.2.887.150 A.3.887.150 A.4.887.150 B.0.887.150 B.1.887.150 B.2.887.150 B.3.887.150 B.4.887.150 C.0.887.150 C.1.887.150 C.2.887.150 C.3.887.150 C.4.887.150 D.0.887.150 D.1.887.150 D.2.887.150 D.3.887.150 D.4.887.150
200 A.0.887.200 A.1.887.200 A.2.887.200 A.3.887.200 A.4.887.200 B.0.887.200 B.1.887.200 B.2.887.200 B.3.887.200 B.4.887.200 C.0.887.200 C.1.887.200 C.2.887.200 C.3.887.200 C.4.887.200 D.0.887.200 D.1.887.200 D.2.887.200 D.3.887.200 D.4.887.200
250 A.0.887.250 A.1.887.250 A.2.887.250 A.3.887.250 A.4.887.250 B.0.887.250 B.1.887.250 B.2.887.250 B.3.887.250 B.4.887.250 C.0.887.250 C.1.887.250 C.2.887.250 C.3.887.250 C.4.887.250 D.0.887.250 D.1.887.250 D.2.887.250 D.3.887.250 D.4.887.250
88c 100 A.0.88c.100 A.1.88c.100 A.2.88c.100 A.3.88c.100 A.4.88c.100 B.0.88c.100 B.1.88c.100 B.2.88c.100 B.3.88c.100 B.4.88c.100 C.0.88c.100 C.1.88c.100 C.2.88c.100 C.3.88c.100 C.4.88c.100 D.0.88c.100 D.1.88c.100 D.2.88c.100 D.3.88c.100 D.4.88c.100
150 A.0.88c.150 A.1.88c.150 A.2.88c.150 A.3.88c.150 A.4.88c.150 B.0.88c.150 B.1.88c.150 B.2.88c.150 B.3.88c.150 B.4.88c.150 C.0.88c.150 C.1.88c.150 C.2.88c.150 C.3.88c.150 C.4.88c.150 D.0.88c.150 D.1.88c.150 D.2.88c.150 D.3.88c.150 D.4.88c.150
200 A.0.88c.200 A.1.88c.200 A.2.88c.200 A.3.88c.200 A.4.88c.200 B.0.88c.200 B.1.88c.200 B.2.88c.200 B.3.88c.200 B.4.88c.200 C.0.88c.200 C.1.88c.200 C.2.88c.200 C.3.88c.200 C.4.88c.200 D.0.88c.200 D.1.88c.200 D.2.88c.200 D.3.88c.200 D.4.88c.200
250 A.0.88c.250 A.1.88c.250 A.2.88c.250 A.3.88c.250 A.4.88c.250 B.0.88c.250 B.1.88c.250 B.2.88c.250 B.3.88c.250 B.4.88c.250 C.0.88c.250 C.1.88c.250 C.2.88c.250 C.3.88c.250 C.4.88c.250 D.0.88c.250 D.1.88c.250 D.2.88c.250 D.3.88c.250 D.4.88c.250
In [9]:
def get_resolution(cell):
    
    TH1D = cell.TH1D()
    
    TH1D.GetXaxis().SetRange(TH1D.FindBin(100),TH1D.FindBin(400))
    
    MaxBin   = TH1D.FindBin(TH1D.GetMaximumBin())
    
    ADC_Low  = MaxBin-60
    ADC_High = MaxBin+40

    gaussFit = ROOT.TF1("gaussFit", "pol1(0)+gaus(2)", ADC_Low, ADC_High)
    gaussFit.SetParameters(1000,-1,TH1D.GetMaximum(),MaxBin,10)
    TH1D.Fit(gaussFit,"QR")
    
    sigma = abs(gaussFit.GetParameter(4))
    centroid_ch = gaussFit.GetParameter(3)
    
    x1 = cell(centroid_ch+sigma*numpy.sqrt(2*numpy.log(2)))
    x2 = cell(centroid_ch-sigma*numpy.sqrt(2*numpy.log(2)))
    centroid = cell(centroid_ch)
        
    fwhm = x1-x2
            
    return sigma*numpy.sqrt(2*numpy.log(2))*2/centroid_ch*100, (fwhm/centroid)*100, centroid
In [10]:
def TH1D_draw(cell):
    
    TH1D = cell.TH1D()
    
    canvas = ROOT.TCanvas()
    canvas.cd()
    
    TH1D.SetTitle(repr(cell))
    TH1D.SetStats(False)
    
    latex = ROOT.TLatex()
    latex.SetNDC()
    latex.SetTextSize(0.03)
    
    TH1D.Draw("pe")
    
    l1,l2,l3 = get_resolution(cell)
    
    l4 = uproot.open(f"../../data/nTOF_March2022/888/CW100ns/Resolutions_Cs137_CenterScatter_iTED{cell.iTED()}_8.8.8_100ns.root:grResolEnergy;1").values()[1][cell.Crystal()]
    
    latex.DrawText(0.7, 0.8, "R_ch: {:.2f}%".format(l1))
    
    if l4*0.9 < l2 < l4*1.1:
        latex.DrawText(0.7, 0.75, "R_E: {:.2f}%".format(l2))
    else:
        latex.DrawText(0.7, 0.75, "->R_E: {:.2f}%".format(l2))
        
    if 662*(1-l2/100) < l3 < 662*(1+l2/100):
        latex.DrawText(0.7, 0.7, "E: {:.0f}keV".format(l3))
    else:
        latex.DrawText(0.7, 0.7, "->E: {:.0f}keV".format(l3))
        
    latex.DrawText(0.7, 0.65, "R_E(old): {:.2f}%".format(l4))
    latex.DrawText(0.7, 0.6, "Change: {:.2f}%".format(l2-l4))
            
    return canvas

Energy resolution @662keV¶

Using channel values¶

In [11]:
spectra.applymap(lambda x: get_resolution(x)[0]).T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[11]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 8.384339 8.284824 8.179738 8.088119 8.404514 8.260254 8.168116 8.069058 8.205656 8.095049 7.989033 7.893597
min 6.572851 6.511189 6.462154 6.437791 6.389740 6.388251 6.388026 6.387243 6.525593 6.523872 6.524571 6.523416
25% 7.075074 7.053681 7.008073 6.964889 7.078504 6.978950 6.931826 6.926262 7.019665 6.955688 6.916974 6.911327
50% 8.225909 8.070114 7.909846 7.781751 8.163990 7.992299 7.856192 7.710460 7.935067 7.823580 7.733675 7.599282
75% 9.645031 9.582242 9.465428 9.371003 9.864735 9.727948 9.630359 9.407380 9.262555 9.173130 9.039284 8.977927
max 11.434119 11.245839 10.762453 10.524706 11.490752 11.455784 11.441227 11.421454 10.867837 10.729804 10.612429 10.583095
Info in <TCanvas::MakeDefCanvas>:  created default TCanvas with name c1

Using the current calibration (March 2023, 888, 100ns)¶

In [12]:
spectra.applymap(lambda x: get_resolution(x)[1]).T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[12]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 7.193958 7.111687 7.024524 6.947401 7.098719 6.980382 6.905127 6.822373 7.027980 6.936768 6.848609 6.768283
min 5.690363 5.638254 5.596447 5.575697 5.567239 5.565940 5.565758 5.565070 5.678580 5.677089 5.677704 5.676694
25% 6.242677 6.203176 6.200747 6.188435 6.281600 6.245942 6.150291 6.113693 6.202920 6.187947 6.161628 6.147785
50% 6.982063 6.845986 6.713506 6.655423 6.821029 6.726619 6.615602 6.502844 6.768357 6.593864 6.543667 6.496192
75% 8.067847 7.972242 7.892667 7.716481 7.826232 7.692682 7.529721 7.397640 7.606198 7.504692 7.448275 7.348455
max 9.941246 9.793617 9.386924 9.029415 9.524203 9.044597 9.066551 8.877154 9.467014 9.299971 8.853431 8.514926
In [13]:
spectra.applymap(lambda x: get_resolution(x)[1]).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[13]:
  iTED A B C D
  Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window                                        
888 100 6.993667 5.690363 8.003727 6.264532 8.513630 8.685116 7.545204 7.159496 6.921517 6.970458 9.941246 7.024431 5.801541 8.581080 8.260210 6.604624 6.177112 6.154822 6.158417 6.427960
150 6.745153 5.638254 7.943185 6.214287 8.491202 8.421423 7.531137 7.111619 6.842958 6.928608 9.793617 6.849014 5.800469 8.484608 8.059413 6.501383 6.169841 6.125247 6.149794 6.432523
200 6.659179 5.596447 7.917940 6.213641 8.473171 8.180773 7.442451 7.047676 6.765897 6.889133 9.386924 6.661115 5.802972 8.298828 7.884243 6.448186 6.162062 6.119100 6.145520 6.395222
250 6.591387 5.575697 7.894197 6.200813 8.431370 8.083150 7.397516 6.999044 6.719459 6.856619 9.029415 6.493300 5.801645 8.054665 7.657242 6.372846 6.151302 6.100846 6.131791 6.405715
887 100 6.716906 5.885172 7.846681 6.556772 8.926923 8.910126 7.538841 6.771155 7.097204 6.870904 9.524203 6.960888 5.567239 8.476957 7.819416 6.328728 6.363272 5.773790 6.140214 5.898985
150 6.535668 5.800937 7.777560 6.451929 8.902208 8.430194 7.412162 6.688939 7.037385 6.849367 9.044597 6.764300 5.565940 8.303461 7.664389 6.292431 6.348265 5.763566 6.106475 5.867876
200 6.442909 5.771719 7.716941 6.419184 8.891864 8.231809 7.349736 6.622017 6.947128 6.741413 9.066551 6.609188 5.565758 8.082529 7.467314 6.171867 6.333189 5.742967 6.085562 5.842901
250 6.400100 5.753039 7.708582 6.419219 8.877154 8.104824 7.293993 6.586469 6.829195 6.727379 8.635466 6.402065 5.565070 7.867197 7.206193 6.120226 6.323636 5.721918 6.094094 5.811644
88c 100 6.848400 6.095302 7.536584 6.269364 8.602156 8.331459 7.549031 6.688313 6.852857 6.632140 9.467014 7.046612 5.678580 8.494920 7.777696 6.421585 6.130319 5.779793 6.227103 6.130370
150 6.623912 6.037643 7.482337 6.213026 8.631772 8.207789 7.438936 6.593293 6.594435 6.587102 9.299971 6.840054 5.677089 8.397128 7.571756 6.326870 6.111083 5.770381 6.218071 6.112710
200 6.583704 6.009039 7.407379 6.181999 8.537732 7.989468 7.375075 6.536205 6.551128 6.534113 8.853431 6.661599 5.677704 8.144216 7.570963 6.219945 6.100512 5.753311 6.207167 6.077498
250 6.509696 5.991072 7.388117 6.165802 8.514926 7.841426 7.285276 6.488878 6.432151 6.536032 8.405071 6.503505 5.676694 7.996617 7.335234 6.191500 6.093731 5.737227 6.195646 6.077063

Energy of the Cesium peak using the current calibration (March 2023, 888, 100ns)¶

In [14]:
spectra.applymap(lambda x: abs(get_resolution(x)[2]-662)/662*100).T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[14]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 2.783928 2.920516 3.030763 3.097189 1.955409 1.920312 1.916828 1.933787 2.357105 2.474974 2.551107 2.606813
min 0.261671 0.273354 0.137220 0.089146 0.029099 0.028333 0.134172 0.095745 0.070286 0.053619 0.043825 0.033794
25% 1.449584 1.852350 1.881064 1.917321 0.325375 0.655081 0.656098 0.700591 1.354216 1.346443 1.336762 1.389725
50% 2.920744 3.069998 3.110387 3.165389 1.821452 1.769053 1.586570 1.651227 2.083279 2.147551 2.184258 2.200536
75% 4.003028 4.287113 4.503136 4.566823 2.765623 2.633653 2.546075 2.561870 3.410597 3.651191 3.736920 3.937449
max 5.426153 5.436203 5.455493 5.461596 6.084582 6.018045 5.972706 5.965306 5.574989 5.593240 5.603651 5.625288

Noise using integral <200keV (Calibration: March 2023, 888, 100ns)¶

In [15]:
spectra.applymap(lambda x: x.Noise(300)).T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[15]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 81.683167 73.282833 67.859833 64.508500 80.962833 71.987167 66.279500 62.832000 77.353500 68.780667 63.268500 59.800333
min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25% 53.284167 49.380000 47.319167 46.515833 54.305833 50.645000 47.484167 45.865000 52.565000 48.716667 45.085000 42.961667
50% 64.158333 63.945000 63.820000 63.720000 65.010000 64.695000 64.351667 64.263333 62.180000 61.200000 60.020000 59.376667
75% 111.253333 96.070000 91.945000 84.095000 103.073333 94.559167 87.672500 84.927500 98.923333 89.616667 82.640833 78.991667
max 192.766667 159.060000 136.826667 122.360000 208.850000 172.166667 147.503333 132.200000 197.046667 161.766667 138.343333 122.543333
In [16]:
spectra.applymap(lambda x: x.Noise(300)).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[16]:
  iTED A B C D
  Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window                                        
888 100 90.290000 77.086667 52.390000 61.160000 0.000000 125.910000 0.000000 48.126667 52.656667 53.493333 192.766667 175.253333 66.003333 134.053333 115.713333 109.766667 95.040000 62.313333 61.446667 60.193333
150 84.043333 71.373333 49.110000 60.306667 0.000000 110.973333 0.000000 42.986667 45.953333 49.470000 159.060000 147.933333 65.980000 109.503333 90.426667 106.370000 92.636667 61.910000 59.560000 58.060000
200 79.276667 68.743333 47.593333 59.790000 0.000000 100.940000 0.000000 40.233333 41.723333 46.496667 136.826667 128.186667 65.963333 93.680000 75.560000 103.483333 91.366667 61.676667 58.580000 57.076667
250 77.573333 67.570000 46.876667 59.330000 0.000000 95.043333 0.000000 38.550000 39.630000 45.433333 122.360000 114.976667 65.933333 81.836667 66.383333 101.693333 90.870000 61.506667 57.973333 56.630000
887 100 100.476667 73.836667 44.673333 64.903333 0.000000 105.963333 0.000000 59.993333 44.493333 47.973333 208.850000 178.473333 65.116667 138.773333 118.506667 91.030000 102.110000 60.210000 56.416667 57.456667
150 96.436667 68.916667 41.740000 64.266667 0.000000 89.286667 0.000000 53.613333 34.890000 41.256667 172.166667 148.636667 65.123333 113.663333 93.933333 88.263333 98.593333 59.580000 54.323333 55.053333
200 92.620000 66.403333 40.426667 63.606667 0.000000 78.896667 0.000000 49.836667 30.460000 37.726667 147.503333 128.506667 65.096667 97.070000 78.600000 86.023333 96.850000 59.163333 53.166667 53.633333
250 90.830000 65.233333 39.680000 63.413333 0.000000 72.660000 0.000000 47.926667 28.590000 36.290000 132.200000 114.823333 65.113333 86.100000 68.856667 84.536667 95.800000 58.913333 52.660000 53.013333
88c 100 90.193333 65.680000 40.256667 59.766667 0.000000 105.183333 0.000000 58.153333 42.673333 44.520000 197.046667 171.106667 63.323333 132.530000 113.256667 91.996667 96.836667 61.036667 55.246667 58.263333
150 85.250000 61.870000 37.690000 58.780000 0.000000 89.343333 0.000000 51.850000 34.940000 39.316667 161.766667 141.106667 63.286667 107.360000 90.006667 89.486667 93.453333 60.530000 53.203333 56.373333
200 81.253333 59.863333 36.003333 58.193333 0.000000 78.560000 0.000000 47.910000 30.860000 36.610000 138.343333 121.696667 63.290000 91.240000 74.946667 86.803333 92.160000 60.176667 52.233333 55.226667
250 78.733333 58.723333 35.386667 57.933333 0.000000 72.163333 0.000000 45.486667 29.060000 35.296667 122.543333 109.300000 63.276667 79.766667 65.703333 85.263333 90.980000 60.030000 51.596667 54.763333

Alpha activity using 1600keV < E < 2800keV (Calibration: March 2023, 888, 100ns)¶

In [17]:
spectra.applymap(lambda x: x.Alpha(300)).T.describe().drop(['count', 'std'], axis=0).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[17]:
Configuration 888 887 88c
Window 100 150 200 250 100 150 200 250 100 150 200 250
mean 151.097667 150.797667 150.653667 150.514000 154.837500 154.582500 154.394500 154.275000 152.493167 152.222833 151.983333 151.891667
min 23.603333 23.700000 23.723333 23.760000 23.936667 23.973333 24.003333 24.016667 24.230000 24.270000 24.380000 24.436667
25% 95.206667 95.145833 95.174167 95.186667 102.195000 102.238333 102.378333 102.337500 94.688333 94.653333 94.688333 94.721667
50% 176.700000 176.380000 176.303333 175.900000 181.468333 181.301667 181.325000 181.373333 175.650000 175.340000 175.136667 175.093333
75% 216.720833 216.290833 216.127500 216.008333 221.419167 220.749167 220.326667 220.070000 221.795000 221.416667 220.708333 220.585000
max 238.063333 238.066667 238.070000 238.070000 238.666667 238.663333 238.666667 238.666667 240.580000 240.583333 240.583333 240.583333
In [18]:
spectra.applymap(lambda x: x.Alpha(300)).style.background_gradient(cmap ='YlOrRd',axis=None)
Out[18]:
  iTED A B C D
  Crystal 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Configuration Window                                        
888 100 24.860000 148.353333 114.170000 36.073333 31.263333 144.330000 121.743333 209.013333 203.166667 216.080000 150.233333 230.230000 238.063333 218.643333 228.553333 23.603333 222.950000 38.316667 206.363333 215.943333
150 24.983333 148.320000 114.080000 36.083333 31.283333 143.596667 120.430000 208.673333 202.793333 215.690000 149.966667 229.516667 238.066667 217.843333 227.483333 23.700000 222.893333 38.343333 206.433333 215.773333
200 25.220000 148.370000 114.116667 36.090000 31.333333 143.350000 119.413333 208.500000 202.830000 215.753333 149.776667 229.026667 238.070000 216.970000 227.050000 23.723333 222.910000 38.346667 206.376667 215.846667
250 25.290000 148.366667 114.143333 36.110000 31.343333 143.176667 118.800000 208.363333 202.626667 215.776667 149.173333 228.880000 238.070000 216.573333 226.470000 23.760000 222.850000 38.316667 206.370000 215.820000
887 100 24.356667 153.090000 122.986667 36.220000 30.953333 152.093333 134.123333 212.510000 209.846667 222.486667 152.493333 232.793333 238.666667 221.063333 231.833333 23.936667 225.200000 39.820000 213.570000 218.706667
150 24.453333 153.113333 123.040000 36.230000 31.023333 152.030000 131.930000 212.270000 209.490000 222.096667 152.710000 232.123333 238.663333 220.300000 231.030000 23.973333 225.110000 39.833333 213.546667 218.683333
200 24.610000 153.103333 123.233333 36.260000 31.046667 151.953333 130.370000 212.096667 209.546667 222.146667 152.266667 231.810000 238.666667 219.720000 230.076667 24.003333 224.970000 39.813333 213.556667 218.640000
250 24.713333 153.210000 123.183333 36.233333 31.053333 151.973333 129.570000 211.876667 209.536667 222.030000 151.726667 231.156667 238.666667 219.416667 230.063333 24.016667 224.990000 39.800000 213.550000 218.733333
88c 100 24.230000 144.443333 113.343333 34.836667 31.183333 147.626667 123.030000 206.073333 200.206667 218.760000 151.093333 232.263333 240.580000 220.146667 228.853333 24.933333 227.563333 38.723333 215.233333 226.740000
150 24.270000 144.353333 113.293333 34.786667 31.203333 147.060000 121.280000 205.773333 199.803333 218.590000 150.876667 231.760000 240.583333 219.680000 227.953333 25.010000 227.630000 38.733333 215.190000 226.626667
200 24.380000 144.273333 113.340000 34.780000 31.230000 146.900000 119.803333 205.500000 199.890000 218.460000 150.383333 231.193333 240.583333 218.746667 227.136667 25.050000 227.530000 38.733333 215.160000 226.593333
250 24.436667 144.393333 113.380000 34.766667 31.270000 146.443333 118.963333 205.386667 199.816667 218.576667 150.370000 230.890000 240.583333 218.523333 226.910000 25.093333 227.546667 38.746667 215.126667 226.610000

Draw fits¶

In [19]:
canvas = spectra.applymap(TH1D_draw)
#canvas.applymap(lambda x: type(x).__name__)
In [20]:
for col in canvas.columns:
    for row in canvas.index:
        canvas.loc[row,col].Draw()

Conclusions:¶